import 'package:hive/hive.dart';

/// 长JSON字符串本地存储工具类
/// 基于Hive实现，支持Map/List类型的JSON数据
class JsonStorageUtil {
  /// 存储盒子名称
  static const String _boxName = 'json_storage';
  
  /// 默认的存储键
  static const String _defaultKey = 'default_long_json';

  /// 初始化存储盒子
  /// 建议在应用启动时调用（如main函数中）
  static Future<void> init() async {
    if (!Hive.isBoxOpen(_boxName)) {
      await Hive.openBox(_boxName);
    }
  }

  /// 获取存储盒子实例
  static Box<dynamic> _getBox() {
    if (!Hive.isBoxOpen(_boxName)) {
      throw Exception('JsonStorageUtil 未初始化，请先调用 init() 方法');
    }
    return Hive.box(_boxName);
  }

  /// 保存JSON数据
  /// [data] 要保存的JSON数据（Map或List）
  /// [key] 存储键，用于后续读取
  static Future<void> saveJson(
    dynamic data, {
    String key = _defaultKey,
  }) async {
    if (data == null) {
      throw ArgumentError('保存的数据不能为null');
    }
    if (data is! Map && data is! List) {
      throw ArgumentError('保存的数据必须是Map或List类型');
    }
    
    final box = _getBox();
    await box.put(key, data);
  }

  /// 读取JSON数据
  /// [key] 存储键
  /// 返回Map或List，若不存在则返回null
  static dynamic getJson({String key = _defaultKey}) {
    final box = _getBox();
    return box.get(key);
  }

  /// 更新JSON数据
  /// 与saveJson功能相同，会覆盖原有数据
  static Future<void> updateJson(
    dynamic data, {
    String key = _defaultKey,
  }) async {
    await saveJson(data, key: key);
  }

  /// 删除指定键的JSON数据
  /// [key] 存储键
  static Future<void> deleteJson({String key = _defaultKey}) async {
    final box = _getBox();
    await box.delete(key);
  }

  /// 清空所有存储的JSON数据
  static Future<void> clearAll() async {
    final box = _getBox();
    await box.clear();
  }

  /// 检查指定键是否存在数据
  static bool hasJson({String key = _defaultKey}) {
    final box = _getBox();
    return box.containsKey(key);
  }

  /// 获取所有存储的键
  static List<String> getAllKeys() {
    final box = _getBox();
    return box.keys.cast<String>().toList();
  }
}
